package com.google.project.client.ProjectManager;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import com.google.gwt.core.client.GWT;
import com.google.gwt.uibinder.client.UiBinder;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.DialogBox;
import com.google.gwt.user.client.ui.Widget;
import com.google.gwt.uibinder.client.UiField;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.uibinder.client.UiHandler;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.project.client.Service.ProjTaskService;
import com.google.project.client.Service.ProjTaskServiceAsync;
import com.google.project.client.Service.ProjectService;
import com.google.project.client.Service.ProjectServiceAsync;
import com.google.project.shared.CommonFuntion;
import com.google.project.shared.ProjectTaskDTO;
import com.google.gwt.user.client.ui.ListBox;

public class PMChangeTaskStatus extends DialogBox {

	private static final Binder binder = GWT.create(Binder.class);
	@UiField Button button;
	@UiField ListBox cboStatus;
	@UiField Button button_1;

	interface Binder extends UiBinder<Widget, PMChangeTaskStatus> {
	}
	
	ProjectTaskDTO currTask = new ProjectTaskDTO();
	List<ProjectTaskDTO> listTask =  new ArrayList<ProjectTaskDTO>();
	//PMChangeTaskStatus dialog = new PMChangeTaskStatus();
	private final ProjTaskServiceAsync projectTaskService = GWT.create(ProjTaskService.class);
	private final ProjectServiceAsync projectService = GWT.create(ProjectService.class);
	public PMChangeTaskStatus() {
		setWidget(binder.createAndBindUi(this));
	}
	
	
	public PMChangeTaskStatus(ProjectTaskDTO task) {
		setWidget(binder.createAndBindUi(this));
		//dialog = this;
		currTask = task;
		cboStatus.addItem("---Chọn---","0");
		cboStatus.addItem("Đã hoàn thành ","1");
		cboStatus.addItem("Ngừng thực hiện ","2");
		projectService.getListTask(task.getProjectId(), new AsyncCallback<List<ProjectTaskDTO>>() {
			
			@Override
			public void onSuccess(List<ProjectTaskDTO> result) {
				// TODO Auto-generated method stub
				listTask = result;
			}
			
			@Override
			public void onFailure(Throwable caught) {
				// TODO Auto-generated method stub
				
			}
		});
	}
void closeDialog()
{
	this.hide();
	}

Boolean checkForFinish(ProjectTaskDTO data)
{
	if(data.getSubTasks()!=null)
	{
		for(ProjectTaskDTO task:listTask)
		{
			if(CommonFuntion.checkContain(data.getSubTasks(),""+task.getTaskId())&&task.getStatus()!=3&&task.getStatus()!=2)
			{
				Window.alert("Không thể kết thúc công việc cha khi có công việc con chưa được kết thúc hoặc ngừng thực hiện.");
				return false;
			}
		}
	}
	
	return true;
	}

	@UiHandler("button")
	void onButtonClick(ClickEvent event) {
		closeDialog();
	}
	//click hoan thanh chuyen trang thai

	@UiHandler("button_1")
	void onButton_1Click(ClickEvent event) {
	
		if(cboStatus.getValue(cboStatus.getSelectedIndex()).equals("0"))
		{
			Window.alert("Bạn phải chọn tình trạng mới cho công việc");
		}
		else
		{
			String message ="";
			if(cboStatus.getValue(cboStatus.getSelectedIndex()).equals("1"))
			{
				message="Bạn có muốn đổi trạng thái công việc thành \"Đã hoàn thành\" không ? " ;
				if(currTask.getStatus()==0)
				{
					Window.alert("Công việc chưa bắt đầu không thể chuyển sang trạng thái \"Đã hoàn thành\"");
				}
				else
				{
					if(checkForFinish(currTask))
					{
						if(Window.confirm(message))
						{
						currTask.setStatus(2);
						//canchange
						//currTask.setFinishDate(currTask.getDueDate());
						//canUse
						currTask.setFinishDate(CommonFuntion.removeTime(new Date()));
						projectTaskService.updateForFinish(currTask, new AsyncCallback<Void>() {
							
							@Override
							public void onSuccess(Void result) {
								// TODO Auto-generated method stub
								Window.alert("Chuyển trạng thái công việc thành công");
								closeDialog();
							}
							
							@Override
							public void onFailure(Throwable caught) {
								// TODO Auto-generated method stub
								Window.alert("Chuyển trạng thái công việc thất bại");
							}
						});
						}
					}
				
				}
			}else
			{
				message = "Bạn có muốn đổi trạng thái công việc thành \"Ngừng thực hiện\" không ? ";
				if (Window.confirm(message)) {

					projectTaskService.updateTaskForClose(currTask, listTask,new AsyncCallback<Void>() {

								@Override
								public void onSuccess(Void result) {
									// TODO Auto-generated method stub
									Window.alert("Chuyển trạng thái công việc thành công");
									closeDialog();
								}

								@Override
								public void onFailure(Throwable caught) {
									// TODO Auto-generated method stub

								}
							});

				}

			}
		
			
		}
	}
}
